/*
 * notificador.cpp
 *
 *  Created on: Oct 16, 2013
 *      Author: m
 */

#include <iostream>
#include <cstdlib>
#include "DefinicionesComunes.h"
#include "NewMessageQueue.h"
#include "NewSemaphore.h"
#include "NewSharedMemory.h"
#include "CPrinter.h"

using namespace ipc;

int main( int argc, char* argv[] )
{
    int cantidadVuelos;

    CPrinter::setHeader( "NOTIFICADOR" );

    /*
     * Parseo los argumentos:
     *  argv[1] : Cantidad de Vuelos disponibles
     */

    if ( argc != 2 )
    {
        CPrinter::printErr( "ERROR: Cantidad de Argumentos Invalida.\n"
                "USO:\tnotificadorEquipajeListo [nVuelos]");
        exit(1);
    }

    std::stringstream ss;

    ss.str( argv[1] );
    ss >> cantidadVuelos;

    // IPCs
    MessageQueue<int> mqNotificacionEquipaje =
            MessageQueue<int>::get( IPC_BASE_FILE, MQ_NOTIFICACIONES );

    SharedMemory<int> shmCantidadEquipaje =
            SharedMemory<int>::get( IPC_BASE_FILE, SHM_CONT_EQUIPAJE );

    SharedMemory<int> shmContadorSospechosos =
            SharedMemory<int>::get( IPC_BASE_FILE, SHM_CONT_SOSPECHOSO );

    Semaphore mutexCantidadEquipaje =
            Semaphore::get( IPC_BASE_FILE, MUTEX_CONT_EQUIPAJE );

    Semaphore mutexContadorSospechosos =
            Semaphore::get( IPC_BASE_FILE, MUTEX_CONT_SOSPECHOSO );

    CPrinter::printOut( "INICIADO" );

    while ( true )
    {
        int idVuelo;
        int equipajeRestante;
        int nSospechosos;

        idVuelo = mqNotificacionEquipaje.get( MTYPE_NOTIFICACIONES );

        mutexCantidadEquipaje.p( idVuelo - 1 );

        equipajeRestante = shmCantidadEquipaje.read( idVuelo - 1 );

        mutexCantidadEquipaje.v( idVuelo - 1 );

        if ( equipajeRestante == 0 )
        {

            CPrinter::printOut( "Se cargo todo el equipaje del vuelo: %d",
                    idVuelo );
        }
        else
        {
            mutexContadorSospechosos.p( idVuelo - 1 );

            nSospechosos = shmContadorSospechosos.read( idVuelo - 1 );

            mutexContadorSospechosos.v( idVuelo - 1 );

            if ( nSospechosos == equipajeRestante )
            {
                CPrinter::printOut( "Quedan pendientes %d equipajes para "
                        "revisar manualmente del vuelo: %d",
                        nSospechosos, idVuelo);
            }
        }
    }
}



